package com.pb.infra.oth.util;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.nio.file.Files;

/**
 * 文件工具类
 *
 * @Author: liudebao
 * @Date: 2020/6/9
 */
@Slf4j
public class FileUtil {
    private FileUtil() {
        throw new IllegalStateException("Utility class");
    }

    /**
     * 创建临时目录
     *
     * @param dir
     * @return
     */
    public static File createTmpDir(String dir) {
        File tmpDir = new File(dir);
        if (!tmpDir.exists()) {
            tmpDir.mkdir();
        } else {
            deleteFile(tmpDir);
        }
        return tmpDir;
    }

    /**
     * 删除目录下的所有文件
     *
     * @param dir
     */
    public static void deleteFile(File dir) {
        try {
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    deleteFile(file);
                } else {
                    Files.delete(file.toPath());
                }
            }
        } catch (Exception e) {
            log.error("Failed to delete file.", e);
        }
    }
    /**
     * 获取文件的大小(返回到达的最高单位)
     * 比如：1024Byte就不再用Byte
     * 直接返回1KB
     * 返回值精确到小数点后3位
     * @param file 文件
     * @return 文件的大小 若文件不存在或者不是文件就返回null
     */
    public static String getSize(File file) {
        long size = getByteSize(file);
        double s = (double) size;
        String unit;
        if (size != -1L) {
            int l;
            if (size < 1024L) {
                l = 0;
            } else if (size < 1024L * 1024L) {
                l = 1;
                s = (double) size / 1024L;
            } else {
                for (l = 2; size >= 1024L * 1024L; l++) {
                    size = size / 1024L;
                    if ((size / 1024L) < 1024L) {
                        s = (double) size / 1024L;
                        break;
                    }
                }
            }
            switch (l) {
                case 0:
                    unit = "Byte";
                    break;
                case 1:
                    unit = "KB";
                    break;
                case 2:
                    unit = "MB";
                    break;
                case 3:
                    unit = "GB";
                    break;
                case 4:
                    //不可能也不该达到的值
                    unit = "TB";
                    break;
                default:
                    //ER代表错误
                    unit = "ER";
            }
            String format = String.format("%.3f", s);
            return format + unit;
        }
        return null;
    }
    /**
     * 获取文件的大小(Byte)
     * @param file 文件
     * @return 文件的大小 若文件不存在或者不是文件就返回null
     */

    public static Long getByteSize(File file) {
        if (file.exists() && file.isFile()) {
            return file.length();
        }
        return null;
    }

    public static void writeBytes(String filePath, OutputStream os) throws IOException
    {
        FileInputStream fis = null;
        try
        {
            File file = new File(filePath);
            if (!file.exists())
            {
                throw new FileNotFoundException(filePath);
            }
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int length;
            while ((length = fis.read(b)) > 0)
            {
                os.write(b, 0, length);
            }
            os.flush();
        }
        catch (IOException e)
        {
            throw e;
        }
        finally
        {
            if (os != null)
            {
                try
                {
                    os.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
            if (fis != null)
            {
                try
                {
                    fis.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * 路径遍历
     * @param str
     * @return
     * 参数一个文件路径，把这个文件路径字符串里，只要出现../ 或者./ 都替换掉""空字符串
     */
    public static String filenameFilter(String str){
        String strInjectListStr = "../|./|/..| |<|>|:|?";
        if(null != strInjectListStr && !"".equals(strInjectListStr)) {
            str = str.toLowerCase();
            // 将此字符串,以|分割，得到字符串数组
            String[] badStrs = strInjectListStr.split("\\|");
            for(int i = 0;i < badStrs.length;i++){
                if(str.indexOf(badStrs[i]) >= 0){
                    str = str.replace(badStrs[i],"");
                }
            }
        }
        return str;
    }

    /**
     * 路径遍历
     * @param str
     * @return
     * 参数一个文件路径，把这个文件路径字符串里，只要出现../ 或者./ 都替换掉""空字符串
     */
    public static String filenameFilter2(String str){
        String strInjectListStr = "../|./|/..| |<|>|?";
        if(null != strInjectListStr && !"".equals(strInjectListStr)) {
            // 将此字符串,以|分割，得到字符串数组
            String[] badStrs = strInjectListStr.split("\\|");
            for(int i = 0;i < badStrs.length;i++){
                if(str.indexOf(badStrs[i]) >= 0){
                    str = str.replace(badStrs[i],"");
                }
            }
        }
        return str;
    }
}
